package com.bizmerce.rnd.oms.decision.criterion.relax;

import java.util.List;

import com.bizmerce.rnd.oms.decision.criterion.Criterion;
import com.bizmerce.rnd.oms.decision.data.BillOfMaterials;
import com.bizmerce.rnd.oms.decision.data.FreeTradeAgreement;
import com.bizmerce.rnd.oms.decision.data.RawMaterial;

/**
 * 누적기준
 * 
 * 당해 물품의 최종 생산자가 국내산이 아닌 FTA 상대국산 원재료를 사용해 물품을 생산한 경우
 * 그 원재료를 국산재료(원산지 재료)로 간주해 특혜관세의 혜택을 부여하는 기준이다.
 * 
 * 대부분 재료누적을 인정하고 있으며, 공정누적은 한-아세안에서 일부 인정한다.
 * @author Gyeseon
 * 
 * 
 * 당해 물품의 최종 생산자가 국내산이 아닌 FTA 상대국산 원재료를 사용해 물품을 생산한 경우 그 원재료를
 * 국산재(원산지 재료)로 간주해 특혜관세의 혜택을 부여하는 기준이다.
 * 
 * 협정별로 누적기준이 모두 다름
 * 기본적으로 재료누적은 인정하나 공정누적은 다름
 * 
 * TODO 재료누적, 공정누적(섬유)을 확인할 수 있도록 클래스를 구분해야함
 * 
 * TODO 각 협정별로 상대국을 관리해야한다. (예, 한-아세안)
 * @author Gyeseon
 *
 * 현재 이 클래스는 재료누적을 기본으로 다룸
 * 협정별 일반기준에 대한 관리가 요구됨
 * 협정별 품목별 기준에 대한 관리가 요구됨
 */
public class AccumulationCriterion implements Criterion {

	public Boolean assign(BillOfMaterials bom) {
		List<RawMaterial> rawMaterials = bom.getRawMaterials();
		
		FreeTradeAgreement fta = bom.getFta();
		List<String> partnerList = fta.getPartnersAsList();
		//기본적으로 국내산이외의 재료를 역외산으로 간주했을 때 FTA별로 해당되는 
		//FTA 파트너를 체크하여 누적기준을 적용 후 역내산으로 변경한다.
		for (RawMaterial material : rawMaterials) {
			if(material.isNotIntraItem()) {
				if(partnerList.contains(material.getCountryOfOrigin())) {
					//역내산 인정
					material.setIntraItem(true);
				}	
			}
		}
		return true;
	}

	public void addRelaxRule(Criterion relaxRule) {
		throw new UnsupportedOperationException("지원하지 않는 메소드입니다.");
	}
}
